package main

import (
	"fmt"
	"math"
)

/* 整数类型

数值类型分为以下几种：整数、浮点数、复数，其中每一种都包含了不同大小的数值类型，例如有符号整数包含int8、int16、int32、int64等，每种数值类型都决定了对应的大小范围和是否支持正负符号。

Go语言同时提供了有符号和无符号的整数类型，其中包括int8、int16、int32和int64四种大小不同的有符号整数类型，与此对应的是uint8、uint16、uint32和uint64四种无符号整数类型。

还有两种整数类型int和uint，分别对应特定CPU平台的字长（机器字大小），其中int表示有符号整数，应用最为广泛，uint表示无符号整数。实际开发中由于编译器和计算机硬件的不同，int和uint所能表示的整数大小会在32bit或64bit之间变化。

大多数情况下，只需要int即可，可以用于循环计数器（for循环中控制循环次数的变量）、数组和切片的索引，以及任何通用目的的整型运算符，通常int类型的处理速度也是最快的。

程序逻辑对整型范围没有特殊需求。例如对象的长度使用内建len()函数返回，这个长度可以根据不同平台的字节长度进行变化。实际使用中，切片或map的元素数量等都可以用int来表示。

反之，在二进制传输、读写文件的结构描述时，为了保持文件的结构不会受到不同编译目标平台字节长度的影响，不要使用int和uint。

*/

/* 浮点类型

两种精度的浮点数 float32 和 float64。

这些浮点数类型的取值范围可以从很微小到很巨大。浮点数取值范围的极限值可以在math包中找到：
常量math.MaxFloat32表示float32能取到的最大数值，大约是3.4e38
常量math.MaxFloat64表示float64能取到的最大数值，大约是1.8e308
float32和float64能表示的最小值分别为1.4e-45和4.9e-324

一个float32类型的浮点数可以提供大约6个十进制数的精度，而float64则可以提供约15个十进制数的精度，通常应该优先使用float64类型，因为float32类型的累计计算误差很容易扩散，并且float32能精确表示的正整数并不是很大。

*/

/* bool

一个布尔类型的值只有两种：true或false。if和for语句的条件部分都是布尔类型的值，并且==和<等比较操作也会产生布尔型的值。

*/

/* 字符串

一个字符串是一个不可改变的字节序列，字符串可以包含任意的数据，但是通常是用来包含可读的文本。

字符串是一种值类型，且值不可变，即创建某个文本后将无法再次修改这个文本的内容，更深入地讲，字符串是字节的定长数组。

一般的比较运算符（==、!=、<、<=、>=、>）是通过在内存中按字节比较来实现字符串比较的，因此比较的结果是字符串自然编码的顺序。字符串所占的字节长度可以通过函数len()来获取，例如len(str)。

Go语言中字符串的内部实现使用UTF-8编码，通过rune类型，可以方便地对每个UTF-8字符进行访问。Go语言也支持按照传统的ASCII码方式逐字符进行访问。



*/

/* 字符类型

一种是uint8类型，或者叫byte型，代表了ASCII码的一个字符。
另一种是rune类型，代表一个UTF-8字符，当需要处理中文、日文或者其他复合字符时，则需要用到rune类型。rune类型等价于int32类型。

byte类型是uint8的别名，对于只占用1个字节的传统ASCII编码的字符来说，完全没有问题，例如var ch byte = 'A'，字符使用单引号括起来。

*/

func main() {

	// 浮点类型格式化
	fmt.Printf("%f\n", math.Pi)
	fmt.Printf("%.2f\n", math.Pi)

	// 多行字符串
	const str = `第一行
第二行
第三行
\r\n
`
	fmt.Println(str)

	// 字符类型
	var ch byte = 65
	fmt.Println(ch)
	ch = '\x41'
	fmt.Println(ch)

	// 各种数据类型的范围
	fmt.Println("int8 range:", math.MinInt8, math.MaxInt8)
	fmt.Println("int16 range:", math.MinInt16, math.MaxInt16)
	fmt.Println("int32 range:", math.MinInt32, math.MaxInt32)
	fmt.Println("int64 range:", math.MinInt64, math.MaxInt64)

	// 初始化一个32位整型值
	var a int32 = 1047483647
	// 输出变量的十六进制形式和十进制值
	fmt.Printf("int32: 0x%x %d\n", a, a)

	// 将a变量数值转换为十六进制, 发生数值截断
	b := int16(a)
	// 输出变量的十六进制形式和十进制值
	fmt.Printf("int16: 0x%x %d\n", b, b)

	// 将常量保存为float32类型
	var c float32 = math.Pi
	// 转换为int类型, 浮点发生精度丢失
	fmt.Println(int(c))
}
